package penjadwalan;
// kelas candidate sebagai sebuah kromosom yang memiliki genotip 
import java.util.ArrayList;
import java.util.Random;
public class Candidate implements Comparable<Candidate> {
        public int SIZE; // jumlah genotip setiap kromosom
        public int[] genotype; // berupa boolean true sebagai bit 1 dan false sebagai bit 0
        private Random rand = new Random(); // generator bilangan random
        protected float randomChance; // titik tengah untuk generate bilangan random antara 0 dan 1
        private final int TOTAL_MACHINE;
        public Candidate() {
            SIZE = 18;
            randomChance = 0.5f;
            genotype = new int[SIZE];			
            TOTAL_MACHINE = 5;
        }
        public Candidate(int _size, float _chance, int _MACHINE){
            SIZE = _size; 
            randomChance = _chance;
            genotype = new int[SIZE];	
            TOTAL_MACHINE = _MACHINE;
        }
        int getGenotype(int index){
            return genotype[index-1];
        }
        // generateGenotype merupakan fungsi untuk mengisi nilai genotip sesuai ukurannya secara random
        void generateGenotype(){
            for (int i = 0; i < genotype.length; i++) {
                    genotype[i] = rand.nextInt(TOTAL_MACHINE); // generate boolean dengan kemungkinan random randomChance
                    //genotype[i] = randomChance > rand.nextFloat(); // generate boolean dengan kemungkinan random randomChance
            }
        }
        // fungsi untuk menerjemahkan genotip sebagai suatu string satu kromosom
        private String kromosom(){
            StringBuilder kromosom = new StringBuilder();
            for (int i = 0; i < genotype.length; i++) {			
                kromosom.append(genotype[i]); // nilai true menjadi bit 1 dan false menjadi bit 0
                //kromosom.append(genotype[i] == true ? 1 : 0); // nilai true menjadi bit 1 dan false menjadi bit 0
            }
            return kromosom.toString();
        }
        // fungsi fitnes setiap kromosom
        int fitnessFunc() {
            int fitness = 0;
//            for (int i = 0; i < genotype.length; i++) {
//                if (genotype[i])
//                    fitness++;
//            }
            return fitness;
        }
        // fungsi pembanding antara kromosom 1 dengan kromosom lainnya
        public int compareTo(Candidate o) {
            int fitness1 = this.fitnessFunc();
            int fitness2 = o.fitnessFunc();
            if (fitness1 < fitness2)
                return 1;
            else if (fitness1 > fitness2)
                return -1;
            else
                return 0;
        }
        @Override
        public String toString(){
                return "gene="+kromosom()+" fit="+fitnessFunc();
        }
    public static void main(String[] args) {
        ArrayList<Machine> mesin = new ArrayList<Machine>();
        mesin.add(new Machine(5, 2, 1, 20, 1, 20000, 0));
        mesin.add(new Machine(5, 2, 1, 20, 1, 20000, 0));
        mesin.add(new Machine(5, 2, 1, 20, 1, 20000, 0));
        mesin.add(new Machine(5, 2, 1, 20, 1, 20000, 0));
        mesin.add(new Machine(5, 2, 1, 20, 1, 20000, 0));
        Fitness fitness = new Fitness(mesin, 100000, 18);
        Candidate tes = new Candidate(18, 0.5f, mesin.size());
        
        for(int i=0;i<20;i++){ // generate sekian jumlah kromosom
            tes.generateGenotype();
            System.out.println(fitness.calculate(tes));
        }
    }
}